const puppeteer = require("puppeteer");
const main = require("./index");
//const decodeImage = require('jimp');
//const qrcodeReader = require('qrcode-reader')

async function bindClickEvent(page, selector, text, callback) {
  await page.evaluate(
    (selector, text, callback) => {
      const itemList = document.querySelectorAll(selector);
      itemList.forEach(item => {
        if (item.textContent === text) {
          item.addEventListener("click", () => {
            // 执行回调函数
            callback();
          });
        }
      });
    },
    selector,
    text,
    callback
  );
}

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    defaultViewport: false
  });
  const page = await browser.newPage();

  // 设置视窗大小和设备比例因子
  await page.setViewport({
    width: 1920, // 设置为屏幕宽度
    height: 1080, // 设置为屏幕高度
    deviceScaleFactor: 1, // 不缩放
    isMobile: false, // 不模拟移动设备
    hasTouch: false, // 不支持触摸事件
    isLandscape: true // 横屏模式
  });
  await page.goto(
    "https://operationplat.umpay.com.cn/OperationPlatWeb/sys/login!login.action"
  );

  // 获取父元素为 .input-bg 的所有元素
  // 截取验证码图片

  // 截取验证码图片
  /*
    const captchaElement = await page.$('#confirmCode'); // 假设验证码图片有一个id为 "captcha" 的元素
    qrDecode("https://operationplat.umpay.com.cn/cas/servlet/validate",function(data){
        console.log(data);
    });{ bb : 0}.
*/

  await page.type("#userId", "linfangjian");
  await page.type("#password", "lin@1qaz");
  await page.type("#userVerifycode", "7056");

  await delay(20000);

  // 查找具有特定 ID 的元素
  const userlogin = await page.$("#userlogin");

  if (userlogin) {
    // 如果找到元素，模拟点击事件
    await userlogin.click();
    console.log("已点击具有特定 userlogin 的元素");
  } else {
    console.log("未找到具有特定 ID 的元素");
  }
  await page.screenshot({ path: "3.png" });
  await page.goto(
    "https://operationplat.umpay.com.cn/OperationPlatWeb/merAcce/merAcceAction!goAddMerJsp.action?nodeId=-99&apprvId=&merId="
  );
  processMain();
  async function processMain() {
    var [inpObj, selectObj, newCount] = await main();
    console.log("count", newCount);
    console.log("inpObj", inpObj);
    for (var key in inpObj) {
      if (key && key != "null") {
        await page.type(key, inpObj[key]);
      }
    }
    for (var key in selectObj) {
      if (key && key != "null") {
        var value = key.split(",");
        await handle404AndType(page, value[0], value[1], selectObj[key]);
      }
    }
    console.log("等待2秒");
    await delay(2000);
    // 点击事件
    const element = await page.$("#ext-gen379");

    if (element) {
      // 如果找到元素，模拟点击事件
      await element.click();
      console.log("已点击提交表单");
      console.log("等待3秒");
      await delay(3000);
    } else {
      console.log("未找到具有特定 ID 的元素");
    }
    newCount -= 1;
    if (newCount > 0) {
        for(var inpId in inpObj){
            await page.$eval(inpId, el => el.value = '');
        }
        for(var selectId in selectObj){
            selectId = selectId.split(',')[1]
            await page.$eval(selectId, el => el.value = '');
        }
        console.log('已清空');
        console.log('执行第'+newCount+'次');
      await processMain();
    } else {
      await page.screenshot({ path: "4.png" });
      await browser.close();
    }
  }
  async function handle404AndType(page, obj1, obj2, text) {
    const gen404 = await page.$(obj1);
    if (gen404) {
      // 如果找到元素，模拟点击事件
      await page.$eval(obj2, function(el, value) {
        return el.removeAttribute("readonly");
      });
      await gen404.click();
      // arr.push(text)
    } else {
      console.log("未找到具有特定 ID 的元素");
    }
    await page.type(obj2, text); //ext-comp-1015
    await delay(200); // 请确保在这之前定义了 delay 函数
    const body = await page.$("body");
    await body.click();
  }

  // 查找具有特定 ID 的元素
})();

// 假设 recognizeCaptcha 是一个外部的验证码识别服务
async function recognizeCaptcha(imageUrl) {
  return "yjj";
  // 这里使用外部验证码识别服务来获取验证码文本
  // 你可能需要使用第三方库或者服务来处理这个任务
  // 这里仅仅是一个示例，具体实现需要根据你的需求和服务来进行
}

// 自定义延迟函数
function delay(time) {
  return new Promise(function(resolve) {
    setTimeout(resolve, time);
  });
}

function qrDecode(data, callback) {
  decodeImage(data, function(err, image) {
    if (err) {
      callback(false);
      return;
    }
    let decodeQR = new qrcodeReader();
    decodeQR.callback = function(errorWhenDecodeQR, result) {
      if (errorWhenDecodeQR) {
        callback(false);
        return;
      }
      if (!result) {
        callback(false);
        return;
      } else {
        callback(result.result);
      }
    };
    decodeQR.decode(image.bitmap);
  });
}
